Queryable WHERE Contains String, Int, DateTime

I am working on this line of code:

query = query.Where(p => 
  p.ChckNumber.ToString().Contains(globalSearch.ToString()) || 
  p.BankAccount.ToString().Contains(globalSearch.ToString()) || 
  p.Description.ToString().Contains(globalSearch.ToString()) || 
  p.CheckAmount.ToString().Contains(globalSearch) || 
  p.ClearedDate.ToString().Contains(globalSearch.ToString()) || 
  p.SentDate.ToString().Contains(globalSearch.ToString()));

With this line of code I basically do a search, it seems to work fine when globalSearchis stringand the type of the column BankAccount, and Description- varcharbut when globalSearch- it is Intor DateTime(-2233 or 4.9.2013) for columns CheckAmount (int), ClearedDate (DateTime), SentDate (DateTime), it returns 0 rows, And if it globalSearchmatches Int, ChckNumber it works!

What am I doing wrong?

I ran this query in SQL Server:

SELECT CONVERT(VARCHAR(MAX), ClearedDate) FROM myTable

and all my dates are returned September 9, 2017 If globalSearch- September 10, 2017, it works, but it does not work for the format I need: 9/9/2017

+4
7

, globalSearch Int, , DateTime, , varchar Int, , DateTime.

. , , , , ClearedDate

:

  • globalSearch CheckAmount
  • .ToString, , Nulls
  • , .

, globalSearch , globalSearch CheckAmount:

var gsStr = globalSearch.ToString();
var gsDate = DateTime.MinDate;
if(globalSearch.GetType() == typeof(DateTime))
{
    gsDate = globalSearch;
}
query = query.Where(p => p.ChckNumber.ToString().Contains(gsStr) 
|| p.BankAccount.ToString().Contains(gsStr) 
|| p.Description.ToString().Contains(gsStr) 
|| p.CheckAmount.ToString().Contains(gsStr) 
|| p.ClearedDate.Date == gsDate.Date
|| p.SentDate.ToString().Contains(gsStr));

# 6.0, Null Propagation Operator , - null :

var gsStr = globalSearch.ToString();
var gsDate = DateTime.MinDate;
if(globalSearch.GetType() == typeof(DateTime))
{
    gsDate = globalSearch;
}
query = query.Where(p => p.ChckNumber?.ToString().Contains(gsStr) 
|| p.BankAccount?.ToString().Contains(gsStr) 
|| p.Description?.ToString().Contains(gsStr) 
|| p.CheckAmount?.ToString().Contains(gsStr) 
|| p.ClearedDate?.Date == gsDate.Date
|| p.SentDate?.ToString().Contains(gsStr));

globalSearch ToString CheckAmount Contains , , , .

+7

, . ? . .

? , integer date , , , , .

varchar .ToString(), . , DateTime Integer, ( , ). .

, . , " ", .

, , nullable .

public partial class AccountQuery
{
    public string CheckNumber { get; set; }
    public string BankAccount { get; set; }
    public string Description { get; set; }
    public int? CheckAmount { get; set; }
    public DateTime? ClearedDate { get; set; }
    public DateTime? SentDate { get; set; }
}

/DTO . AccountQuery .

public class Account
{
    public string CheckNumber { get; set; }
    public string BankAccount { get; set; }
    public string Description { get; set; }
    public int CheckAmount { get; set; }
    public DateTime ClearedDate { get; set; }
    public DateTime SentDate { get; set; }
    public bool Matches(AccountQuery query)
    {
        return (!string.IsNullOrEmpty(query.CheckNumber) && query.CheckNumber == CheckNumber) ||
               (!string.IsNullOrEmpty(query.BankAccount) && query.BankAccount == BankAccount) ||
               (!string.IsNullOrEmpty(query.Description) && query.Description == Description) ||
               (query.ClearedDate.HasValue && query.ClearedDate == ClearedDate) ||
               (query.SentDate.HasValue && query.SentDate == SentDate) ||
               (query.CheckAmount.HasValue && query.CheckAmount == CheckAmount);
    }
}

, :

var aq = new AccountQuery
{
    ClearedDate = DateTime.Today
};
query.Where(p => p.Matches(aq));

, , , , .

+2

ToString Numerics

globalsearch String NUmeric ,

, , integer double. DateTime,

p.ClearedDate.ToString( "dd/MM/yyyy" ) globalsearch ,

,

query = query.Where(p = > p.ChckNumber == int.TryParse(globalSearch.ToString, out num)? num: globalSearch.ToString(); || p.BankAccount.ToString(). (globalSearch.ToString()) || p.Description.ToString(). (globalSearch.ToString()) || p.CheckAmount == decimal.TryParse(globalSearch.ToString, out num)? num: globalSearch.ToString(); || p.ClearedDate.ToString( "dd/MM/yyyy" ). (globalSearch.ToString()) ||. P.SentDate.ToString( "//" ) (globalSearch.ToString()));

+2

, , .

SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 103)
+1

char. char ToString . .

query = query.Where(p => 
p.ChckNumber.ToString().Contains(globalSearch.ToString()) || 
p.BankAccount.ToString().Contains(globalSearch.ToString()) || 
p.Description.ToString().Contains(globalSearch.ToString()) || 
p.CheckAmount.ToString().Contains(globalSearch) || 
p.ClearedDate.ToString("d").Contains(globalSearch.ToString()) || 
p.SentDate.ToString("d").Contains(globalSearch.ToString()));

ToShortDateString() d ToString ( "d" )

query = query.Where(p => 
p.ChckNumber.ToString().Contains(globalSearch.ToString()) || 
p.BankAccount.ToString().Contains(globalSearch.ToString()) || 
p.Description.ToString().Contains(globalSearch.ToString()) || 
p.CheckAmount.ToString().Contains(globalSearch) || 
p.ClearedDate.ToShortDateString().Contains(globalSearch.ToString()) || 
p.SentDate.ToShortDateString().Contains(globalSearch.ToString()));
+1

.

 p.ClearedDate.ToString("dd/MM/yyyy").Contains(globalSearch.ToString("dd/MM/yyyy"))

linq Pad linq, , SQL

+1

. , .

, 110 → mm-dd-yyyy

 SELECT CONVERT(VARCHAR(MAX), ClearedDate, 110) FROM myTable
+1

Source: https://habr.com/ru/post/1671276/


All Articles