2012-01-07 1 views
1
Dictionary<int, string> D = new Dictionary<int, string>(); 
D.Add(0, "Insert"); 
D.Add(1, "Update"); 
D.Add(2, "Delete"); 

using (SerasMacEntity SME = new SerasMacEntity()) 
{ 
    var SQL = (from p in SME.tbl_admin_islem 
       let testx = D.Where(x => x.Key == p.islem).Select(x => x.Value).FirstOrDefault() 
       orderby p.tarih descending 
       select new 
       { 
        p.id, 
        p.islem, 
        p.tarih 
       }); 

    Store1.DataSource = SQL; 
    Store1.DataBind(); 
} 

Его отказ от этой ошибки;Почему я не могу использовать словарь с Entity Framework

'System.Collections.Generic.KeyValuePair`2' и только примитивные типы ('такие как Int32, String и Guid')

Я использую этот метод в Linq, но я могу» t использовать Entity.

public class table 
{ 
    public int ID { get; set; } 
    public string Adi { get; set; } 
    public int IslemID { get; set; } 
    public table() { } 
    public table(int _ID, string _Adi, int _IslemID) 
    { 
     _ID = ID; 
     _Adi = Adi; 
     _IslemID = IslemID; 
    } 
} 

public List<table> table_list = new List<table>(new table[] 
{ 
    new table{ID=1,Adi="A1",IslemID=0}, 
    new table{ID=2,Adi="A2",IslemID=1}, 
    new table{ID=3,Adi="A3",IslemID=2}, 
    new table{ID=4,Adi="A4",IslemID=1}, 
    new table{ID=5,Adi="A5",IslemID=0}, 
    new table{ID=6,Adi="A6",IslemID=2}, 
    new table{ID=7,Adi="A7",IslemID=0}, 
    new table{ID=8,Adi="A8",IslemID=1}, 
    new table{ID=9,Adi="A9",IslemID=3} 
}); 

public Dictionary<int, string> option_dictionary = new Dictionary<int,string>() 
{ 
    {0, "OK"}, 
    {1, "NO"}, 
    {2, "YA"}, 
    {3, "OH"} 
}; 

public void TestL() 
{ 
    string b = option_dictionary.Where(x => x.Key == 1).Select(x =>x.Value).First(); 

    var SQL = (from p in table_list 
    let test = option_dictionary.Where(x => x.Key == p.IslemID).Select(x => x.Value).First() 
    select new 
    { 
     p.ID, 
     p.Adi, 
     test 
    } 
    ); 
} 

Этот метод работает в Linq. Он не работает в Entity.

Благодарим за помощь.

ответ

1

Я решаю этот метод;

var SQL = (from p in SME.tbl_admin_islem 
        orderby p.tarih descending 
        select new 
        { 
         p.id, 
         p.islem, 
         p.tarih 
        }).AsEnumerable().Select(s => new 
           { 
            s.id, 
            s.islem, 
            s.tarih, 
            testx = D.Where(x => x.Key == s.islem).Select(x => x.Value).FirstOrDefault() 
           }); 

или попробовать это

var SQL = (from p in SME.tbl_admin_islem.AsEnumerable() 
        orderby p.tarih descending 
        select p).Select(s => new 
        { 
         s.id, 
         s.islem, 
         s.tarih, 
         testx = D.Where(x => x.Key == s.islem).Select(x => x.Value).FirstOrDefault() 
        }); 

Я конвертировать мой объект AsEnumerable(), а затем применить снова лямбда-запрос.

+2

Первый способ хорош. Во-вторых, я не уверен. Я верю, что он загрузит полные объекты в память, а затем применит сортировку и проецирование в анонимный тип впоследствии в памяти. Я думаю, второй способ менее эффективен, чем первый. – Slauma

2

LINQ - это не то же самое, что LINQ. В вашем рабочем примере используется структура данных в памяти, а именно List<table> table_list или, в целом, IEnumerable<T>. Использование методов расширения LINQ для IEnumerable<T> называется LINQ to Objects.

При применении LINQ к ObjectSet<T> или DbSet<T> от Entity Framework вы используете методы расширения LINQ от IQueryable<T>. В этом случае вы используете LINQ to Entities. Они имеют одинаковое имя, и вы можете написать те же выражения LINQ, что и LINQ to Objects, и ваш код будет компилироваться в порядке.

Но большая разница заключается в том, что запрос LINQ to Entities не выполняется в памяти (например, LINQ to Objects), но он должен быть переведен в SQL, который должен быть выполнен в базе данных.

Если ваш запрос не переводится в SQL или перевод не поддерживается, вы получаете исключение во время выполнения. В вашем конкретном случае у вас есть сложная структура данных памяти - ваш словарь - который не может использоваться в запросе SQL.

Чтобы решить эту проблему, вам необходимо переписать запрос. Я бы использовал словарь после выполнения запроса, например, таким образом:

public class Helper 
{ 
    public int id { get; set; } 
    public int islem { get; set; } 
    public string textx { get; set; } 
    // ... 
} 

using (SerasMacEntity SME = new SerasMacEntity()) 
{ 
    var SQL = (from p in SME.tbl_admin_islem 
       orderby p.tarih descending 
       select new Helper 
       { 
        id = p.id, 
        islem = p.islem, 
        //... 
       }); 

    var list = SQL.ToList(); // excutes query in DB, rest happens in memory 
    foreach (var item in list) 
    { 
     item.testx = D.Where(x => x.Key == item.islem) 
         .Select(x => x.Value) 
         .FirstOrDefault(); 
    } 

    Store1.DataSource = list; 
    Store1.DataBind(); 
} 
+0

Спасибо дорогой @Slauma. Я понял IEnumerable и IQueryable отличия. Спасибо за вашу помощь снова. –