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'和Only基本类型 ('如Int32,String和Guid')
我在Linq中使用此方法但我无法使用实体。
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。它不在实体中工作。
感谢您的帮助。
答案 0 :(得分:2)
LINQ与LINQ不同。您的工作示例在内存中使用数据结构,即List<table> table_list
或更通常为IEnumerable<T>
。使用IEnumerable<T>
的LINQ扩展方法称为 LINQ to Objects 。
当您将LINQ应用于实体框架的ObjectSet<T>
或DbSet<T>
时,您正在使用IQueryable<T>
的LINQ扩展方法。在这种情况下,您使用 LINQ to Entities 。它们具有相同的名称,您可以编写与LINQ to Objects相同的LINQ表达式,并且您的代码可以正常编译。
但最大的区别是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 :(得分: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(),然后再次应用Lambda查询。