我正在使用这个C#和linq到sql:
string currentLabel = from s2f in stream2FieldTypesTable
where s2f.s2fID == item.s2fID
&& (s2f.s2fLabel != item.s2fLabel || s2f.s2fIsRequired != item.s2fIsRequired)
select s2f.s2fLabel;
我收到编译错误,说我无法将System.Linq.IQueryable<string>
类型分配给string
。
我试过这段代码:
string currentLabel = from s2f in stream2FieldTypesTable
where s2f.s2fID == item.s2fID
&& (s2f.s2fLabel != item.s2fLabel || s2f.s2fIsRequired != item.s2fIsRequired)
select s2f.s2fLabel.ToString();
然后返回相同的错误。我确信这是一件简单的事情。我错过了什么?我只想要匹配where子句的第一个s2fLabel
。
答案 0 :(得分:13)
您的查询的实际类型将是 IEnumerable 。 LINQ有一个deffered execution的概念,为了让你查询实际的exectuted,你需要调用一个迭代 IEnumerable 的方法:
string currentLabel = (from s2f in stream2FieldTypesTable
where s2f.s2fID == item.s2fID
&& (s2f.s2fLabel != item.s2fLabel || s2f.s2fIsRequired != item.s2fIsRequired)
select s2f.s2fLabel)
.FirstOrDefault();
为了获得准确的一个实例,它可以是 FirstOrDefault()方法或 SignleOrDefault()或只是 First()或 Single ()的。唯一的区别是没有“OrDefault()”的方法如果枚举不能满足他们的期望就会抛出异常,而带有“OrDefault()”的方法只会返回null。
修改强>
Single 和 First 之间的区别在于 Single 需要确切的元素集合 >首先期望至少一个元素。
答案 1 :(得分:2)
int id =Convert.ToInt32(db.Table.Single(x => x.Id == id_factor).Id);
答案 2 :(得分:1)
尝试使用First()
或FirstOrDefault()
代替(或除此之外)ToString()
。
First
和FirstOrDefault
会返回单个记录,而不是记录集合,这是您的第一个查询所做的。
答案 3 :(得分:1)
试试此代码
var result = (from s2f in stream2FieldTypesTable
where s2f.s2fID == item.s2fID
&& (s2f.s2fLabel != item.s2fLabel || s2f.s2fIsRequired != item.s2fIsRequired)
select s2f.s2fLabel).First();
需要,因为你的结果是
IEnumerable<String>
答案 4 :(得分:1)
你需要做的就是在你的LINQ之前和之后添加括号然后使用.FirstOrDefault()你只想要单个值(你的bcoz你有字符串currentLabel)。
string currentLabel =(来自s2f in stream2FieldTypesTable 其中s2f.s2fID == item.s2fID &安培;&安培; (s2f.s2fLabel!= item.s2fLabel || s2f.s2fIsRequired != item.s2fIsRequired) 选择s2f.s2fLabel).FirstOrDefault();