Почему я не могу использовать словарь с Entity Framework - PullRequest
1 голос
/ 07 января 2012
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();
}

Это дает эту ошибку;

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

Я использую этот метод в Linq, но не могу использовать 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 не работает.

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 07 января 2012

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();
}
1 голос
/ 08 января 2012

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

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 () и затем применил снова лямбда-запрос.

...