我想知道在使用带有Entity Framework的文本类型字段时如何搜索空字符串。
我查看了Entity正在生成的SQL查询,它使用LIKE进行比较,因为它在文本类型字段中搜索,所以当我使用.Equals(“”),==“”,== string.Empty时,.Contains(“”),. CONTins(string.Empty),以及其他一切,它返回所有结果,因为它的sql查询就像''和==命令抛出异常,因为它使用了无效的=命令文字类型字段。
当我尝试使用.Equals(null),. CONTins(null),== null时,它什么都不返回,因为它正在生成FIELD ISNULL命令。
我已经尝试过.Lenght == 0但是它会引发异常......
答案 0 :(得分:0)
这对我有用:
public class POCO
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
static void Main(string[] args)
{
var pocos = new List<POCO>
{
new POCO { Id = 1, Name = "John", Description = "basic" },
new POCO { Id = 2, Name = "Jane", Description = "" },
new POCO { Id = 3, Name = "Joey", Description = string.Empty }
};
pocos.Where(x => x.Description == string.Empty)
.ToList()
.ForEach(x => Console.WriteLine($"{x.Id} {x.Name} {x.Description}"));
}
但是,如果您正在使用Entity Framework,问题可能是您可以使用的数据无法完全实现T4生成的对象。 EG从数据库转换不填充对象以正确询问。我会像这样做一个操作来看:
using (var context = new YOURCONTEXTNAME())
{
var persons = context.YOURDATABASEOBJECT.ToList();
persons.ForEach(x => Console.WriteLine($"{x.COLUMNINQUESTION}"));
}
如果您已成功获取数据,则应检索该数据。如果可能,我不会使用文字。使用varchar(max)nvarchar(max)xml,无论最终将被弃用的文本是什么,都是错误的形式,以便在此时继续使用。
EDIT 好吧,我明白了,答案是你不能在它完全实现文本时才能与对象进行交互。我在我的本地数据库上做了一个测试并创建了一个上下文并测试了它,当然你不能在文本上做'== string.empty','==“”'或'String.IsNullOrEmpty()'。但是,一旦在实现的对象中实现了对象,就可以执行此操作。 EG:
// Won't work as context does not understand type
//var persons = context.tePersons.Where(x => x.Description == string.Empty).ToList();
//Works fine as transformation got the object translated to a string in .NET
var start = context.tePersons.ToList();
var persons = start.Where(x => x.Description == String.Empty).ToList();
这显然会带来一个问题,因为您需要在执行谓词之前获取所有数据。不是任何措施的最佳手段。你可以为此做一个sql对象,然后做一个函数,proc或view来改变它。