我今天刚开始自学Linq to SQL。关于linq几乎一无所知。话虽这么说,我有一个查询,我想从我的数据库返回一个名称。它是DB中的varchar
var query = from a in FRESH.Customers
select a.CUSTOMER_NAME;
dataGridView1.DataSource = query;
这会生成一个名为“Length”的列的gridview,并显示每个名称的长度。如果我将查询更改为select a
,则一切正常。我在这里做错了什么?
答案 0 :(得分:4)
默认情况下,DataGridView
会将列表中所有类型的属性显示为列。由于您的查询返回了string
的集合,string
的{{3}}为Length
,因此它会将其显示为列。
尝试更改为
var query = from a in FRESH.Customers
select new {Name = a.CUSTOMER_NAME};
1 从技术上讲,索引器Chars
是一个“属性”,但DataGridView
必须足够聪明,不要将索引器用作列。
答案 1 :(得分:1)
问题出在gridView中,而不是在Linq中 - gridView在DataSource
中查找对象的属性。它与第一个找到的财产绑定。因此它通过Length
属性(它是String
对象具有的唯一属性)绑定字符串。
在gridView中显示字符串的默认方法是创建一些包装器,它将具有字符串值的属性:
public class StringValue
{
public string Value { get; set; }
}
当您创建匿名对象时,正如@DStanley建议的那样,Linq为您创建了包装器:
var query = from a in FRESH.Customers
select new { CustomerName = a.CUSTOMER_NAME};
GridView将在匿名对象中查找属性,它将查找并使用CustomerName
属性。