Tôi đã đập đầu vào vấn đề này đôi khi. Có một số trường hợp tương tự, nhưng các giải pháp không áp dụng cho trường hợp của tôi.LINQ động (đối với thực thể) Ở đâu có cột DateTime không thể sử dụng
Tôi có phương thức trả về truy vấn bộ lọc ở định dạng chuỗi. Phương pháp này có logic với nhiều loại dữ liệu khác nhau, đặt giá trị đúng, tên cột, vv
string filterQuery = GetFilterQuery(params);
rows = rows.Where(filterQuery);
Vấn đề của tôi là tôi có Nullable DateTime
trong cơ sở dữ liệu và tôi có String
đại diện ở phía mã.
Tôi đã cố gắng truy vấn sau đây (String
đại diện có thể là sai hiện tại):
"BirthDate.ToString() = \"16.2.2012 22:00:00\""
quả: '? DateTime' Phương pháp theo loại không thể truy cập
"BirthDate.Value.ToString() = \"16.2.2012 22:00:00\""
quả: LINQ to Entities không nhận ra phương pháp 'System.String ToString()' phương pháp, và phương pháp này không thể được dịch sang một biểu hiện cửa hàng.
"BirthDate == null ? 1=1 : (DateTime)BirthDate.ToString() = \"16.2.2012 22:00:00\""
quả: '' hay '(' dự kiến
Bất kỳ ý tưởng làm thế nào để giải quyết vấn đề?
Cập nhật (mã nguồn hơn thêm về thế hệ truy vấn)
var filterQueries = query.GridFilteringOptions.filters
// remove filters that doesn't have all the required information
.Where(o => o.name != string.Empty && o.value != string.Empty && !string.IsNullOrEmpty(o.type))
// remove filters that are filtering other tables than current
.Where(o => o.table == tableName)
.Select(filter => filter.ResolveQuery()).ToList();
if (filterQuery.Any())
{
var filterQuery = string.Join(" And ", filterQueries);
rows = rows.Where(filterQuery);
}
Và đây là một bộ lọc lớp và phương pháp liên quan đến ngữ cảnh này
public string ResolveQuery()
{
if (type == "Int64")
{
return ResolveInteger();
}
else if(type == "String")
{
return ResolveString();
}
else if(type == "DateTime")
{
return ResolveDateTime();
}
else
{
return string.Empty;
}
}
private string ResolveDateTime()
{
DateTime result = new DateTime();
if (DateTime.TryParse(this.value, out result))
{
return string.Format("{0}.ToString() = \"{1}\"", this.name, result.ToUniversalTime());
}
return string.Empty;
}
private string ResolveString()
{
switch (@operator)
{
default:
return string.Format(@"{0}.StartsWith(""{1}"")", this.name, this.value);
}
}
private string ResolveInteger()
{
string tmp = this.name;
switch (@operator)
{
case -1:
return string.Empty;
case 0:
tmp += "<";
break;
case 1:
tmp += "=";
break;
case 2:
tmp += ">";
break;
default:
return string.Empty;
}
tmp += value;
return tmp;
}
BirthDate.ToString() - Ngày sinh là gì trong ngữ cảnh này? Trong trường hợp của tôi chỉ là một tên cột, vì vậy nó không tồn tại trong ngữ cảnh mã. – Tx3
Tôi hiểu. Hãy xem câu trả lời cập nhật của tôi. –
Cảm ơn, tôi sẽ thử cách tiếp cận chưa được kiểm tra cũng – Tx3